package com.xuelang.pipeline.app.resource.impl;

import org.springframework.cloud.client.circuitbreaker.NoFallbackAvailableException;
import java.lang.RuntimeException;
import java.util.concurrent.TimeoutException;
import com.xuelang.pipeline.app.resource.DynamicPodService;
import com.xuelang.pipeline.app.resource.request.PodListRequest;
import com.xuelang.pipeline.app.resource.request.PodLogRequest;
import com.xuelang.pipeline.client.common.result.ApiResult;
import org.springframework.cloud.openfeign.FallbackFactory;
import io.kubernetes.client.openapi.models.V1PodList;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.net.URI;

/**
 * 动态Pod服务fegin调用失败回调实现类
 *
 * @author xiwen.zxg
 * @since 2024/5/15
 */
@Slf4j
@Service
public class DynamicPodServiceFallbackImpl implements FallbackFactory<DynamicPodService> {


    @Override
    public DynamicPodService create(Throwable throwable) {
        String fallReason = throwable.getMessage();
        if (throwable instanceof TimeoutException) {
            fallReason = "Socket connect timeout.";
        } else if (throwable instanceof NoFallbackAvailableException) {
            fallReason = "Bad Request.";
        } else if (throwable instanceof RuntimeException) {
            fallReason = "Runtime exception";
        }

        final String returnFallReason = fallReason;

        log.error("调用fegin数据接口失败。接口名称:{}；失败原因:{}", this.getClass().getName(), fallReason);
        return new DynamicPodService() {

            ApiResult apiResult = ApiResult.fail("worker返回异常：" + returnFallReason);

            @Override
            public ApiResult<V1PodList> list(URI uri, PodListRequest podListRequest) {
                return apiResult;
            }

            @Override
            public ApiResult<String> log(URI uri, PodLogRequest podLogRequest) {
                return apiResult;
            }


        };
    }

}
